home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / bbs / Hydra11s.lha / HBBS / Source / Misc / TecLisMailSys / MailRead.c < prev    next >
C/C++ Source or Header  |  1996-06-25  |  17KB  |  579 lines

  1. //                      12345678901234567890123456789012345678901234567890123456789012345678901234567890
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #include <dos/dos.h>
  8. #include <exec/types.h>
  9. #include <exec/memory.h>
  10.  
  11. #include <clib/dos_protos.h>
  12. #include <clib/exec_protos.h>
  13. #include <clib/alib_protos.h>
  14.  
  15. #include <HBBS/ANSI_Codes.h>
  16. #include <HBBS/Defines.h>
  17. #include <HBBS/types.h>
  18. #include <HBBS/structures.h>
  19. #include <HBBS/hbbscommon_protos.h>
  20. #include <HBBS/hbbscommon_pragmas.h>
  21. #include <HBBS/Hbbsnode_protos.h>
  22. #include <HBBS/Hbbsnode_pragmas.h>
  23.  
  24. #include "maildoor.h"
  25. #include "mailscan.h"
  26. #include "mailread.h"
  27.  
  28. BOOL GoingForwards;
  29.  
  30. BOOL MAILREAD_CheckOption( int OptNumber )
  31. {
  32.   BOOL OptExists = FALSE;
  33.  
  34.   switch( OptNumber )
  35.   {
  36.     case MAILREAD_OPT_ClearScreen:
  37.       OptExists = TRUE;
  38.       break;
  39.   }
  40.  
  41.   return( OptExists );
  42. }
  43.  
  44. void MAILREAD_UpdateConfMailData( int ConfNum, int FirstMessage, int LastMessage, char *MessageString, int OffSet )
  45. {
  46.   char buffer[BUFFER_LENGTH], filename[MAX_PATH_LENGTH], filename3[MAX_PATH_LENGTH];
  47.   struct Node *ConfPtr;
  48.   BPTR lock;
  49.   int n;
  50.   BOOL Okay = TRUE, Found = FALSE, Kill = FALSE, Both = FALSE;
  51.   struct CfgFileData *CfgFile;
  52.  
  53.   if( OffSet==MailSys_Kill )
  54.   {
  55.     OffSet = MailSys_OFFSET_FirstMessage;
  56.     Kill = TRUE;
  57.   }
  58.   if( OffSet==MailSys_Both )
  59.   {
  60.     OffSet = MailSys_OFFSET_FirstMessage;
  61.     Both = TRUE;
  62.   }
  63.  
  64.   ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
  65.  
  66.  
  67.  
  68.   sprintf( filename, "%sMail/MAIL.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath );
  69.  
  70.   if( CfgFile=HBBS_LoadConfig( filename ) )
  71.   {
  72.  
  73.     if( OffSet == MailSys_OFFSET_FirstMessage )
  74.     {
  75.       if( !Kill )
  76.       {
  77.         n = FirstMessage;
  78.         Found = FALSE;
  79.         while( (!Found) && (n <= LastMessage+1))
  80.         {
  81.           n++;
  82.           sprintf( filename3, "%sMail/Messages/%d.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, n );
  83.           if( lock = Lock( filename3, SHARED_LOCK ))
  84.           {
  85.             UnLock( lock );
  86.             Found = TRUE;
  87.           }
  88.         }
  89.       }
  90.       else
  91.       {
  92.         n = 0;
  93.         OffSet = MailSys_OFFSET_LastMessage;
  94.       }
  95.       sprintf( buffer, "%d", n );
  96.       Okay = FALSE;
  97.       if( HBBS_RemoveCfgItem( CfgFile, "First" ) )
  98.         if( HBBS_AddCfgItem( CfgFile, "First", buffer ) )
  99.           Okay = TRUE;
  100.       if( Both )
  101.         OffSet = MailSys_OFFSET_LastMessage;
  102.     }
  103.     if( OffSet == MailSys_OFFSET_LastMessage )
  104.     {
  105.       if( !Kill )
  106.       {
  107.         n = LastMessage+2;
  108.         Found = FALSE;
  109.         while( (!Found) && (n >= FirstMessage-1))
  110.         {
  111.           n--;
  112.           sprintf( filename3, "%sMail/Messages/%d.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, n );
  113.           if( lock = Lock( filename3, SHARED_LOCK ))
  114.           {
  115.             UnLock( lock );
  116.             Found = TRUE;
  117.           }
  118.         }
  119.       }
  120.       else
  121.       {
  122.         n=0;
  123.       }
  124.       sprintf( buffer, "%d", n );
  125.       Okay = FALSE;
  126.       if( HBBS_RemoveCfgItem( CfgFile, "Last" ))
  127.       {
  128.         if( HBBS_AddCfgItem( CfgFile, "Last", buffer ) )
  129.         {
  130.           Okay = TRUE;
  131.         }
  132.       }
  133.     }
  134.     HBBS_SaveConfig( CfgFile );
  135.     HBBS_FlushConfig( CfgFile );
  136.   }
  137.  
  138.   if( !Okay )
  139.   {
  140.     DOOR_WriteText( "Error in Message Base!!!!!\r\n" );
  141.   }
  142. }
  143.  
  144. void MAILREAD_UpDateMessage( int ConfNum, char *MessageString, int OffSet )
  145. {
  146.   char *buffer = NULL, buffer2[BUFFER_LENGTH], filename[MAX_PATH_LENGTH];
  147.   struct Node *ConfPtr;
  148.   int n;
  149.   struct CfgFileData *CfgFile;
  150.  
  151.   ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
  152.  
  153.   sprintf( filename, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
  154.  
  155.   if( CfgFile=HBBS_LoadConfig( filename ))
  156.   {
  157.     HBBS_GetSetting( CfgFile, (void *)&buffer, VTYPE_STRING, "Read", OPT_SINGLE );
  158.     n = atoi( buffer );
  159.     n++;
  160.     sprintf( buffer2, "%d", n );
  161.     if( HBBS_RemoveCfgItem( CfgFile, "Read" ) )
  162.       HBBS_AddCfgItem( CfgFile, "Read", buffer2 );
  163.     HBBS_SaveConfig( CfgFile );
  164.     HBBS_FlushConfig( CfgFile );
  165.   }
  166. }
  167.  
  168. BOOL MAILREAD_DisplayHead( char *MessageString, int ConfNum, int LastMessage )
  169. {
  170.   BOOL Okay = TRUE;
  171.   char outstr[BUFFER_LENGTH];
  172.   struct Node *ConfPtr;
  173.   struct MAIL_Message *MM;
  174.  
  175.   MYDOOR_DisplayTecLisMailHeader();
  176.  
  177.   ConfPtr = GetNode( BBSGlobal->ConfList , ConfNum-1 );
  178.  
  179.   if( MM = MAILSCAN_CreateMailMsgStruct( ConfNum, MessageString ))
  180.   {
  181.     sprintf( outstr, "Conference  : %s (%s/%d)\r\n\r\n", ConfPtr->ln_Name, MessageString, LastMessage );
  182.     DOOR_WriteText( outstr );
  183.     sprintf( outstr, "From        : "ANSI_FG_CYAN"%s"ANSI_FG_WHITE"\r\n", MM->MM_From );
  184.     DOOR_WriteText( outstr );
  185.     sprintf( outstr, "To          : "ANSI_FG_CYAN"%s"ANSI_FG_WHITE"\r\n", MM->MM_For );
  186.     DOOR_WriteText( outstr );
  187.     sprintf( outstr, "Subject     : "ANSI_FG_CYAN"%s"ANSI_FG_WHITE"\r\n", MM->MM_Subject );
  188.     DOOR_WriteText( outstr );
  189.     sprintf( outstr, "Times Read  : "ANSI_FG_CYAN"%d"ANSI_FG_WHITE"\r\n", MM->MM_Read );
  190.     DOOR_WriteText( outstr );
  191.     sprintf( outstr, "Times DLed  : "ANSI_FG_CYAN"%d"ANSI_FG_WHITE"\r\n", MM->MM_DownLoaded );
  192.     DOOR_WriteText( outstr );
  193.  
  194.     MAILREAD_UpDateMessage( ConfNum, MessageString, MailSys_OFFSET_MessageRead );
  195.   }
  196.   else
  197.   {
  198.     Okay = FALSE;
  199.   }
  200.   return( Okay );
  201. }
  202.  
  203. BOOL MAILREAD_DeleteMessage( char *MessageString, int FirstMessage, int LastMessage, int ConfNum )
  204. {
  205.   char filename1[MAX_PATH_LENGTH], filename2[MAX_PATH_LENGTH];
  206.   struct Node *ConfPtr;
  207.   BPTR lock1, lock2;
  208.   int n;
  209.  
  210.   ConfPtr = GetNode( BBSGlobal->ConfList , ConfNum-1 );
  211.  
  212.   sprintf( filename1, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
  213.   sprintf( filename2, "%sMail/Messages/%s.TXT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
  214.  
  215.   if( lock1 = Lock( filename1, EXCLUSIVE_LOCK ))
  216.   {
  217.     if( lock2 = Lock( filename2, EXCLUSIVE_LOCK ))
  218.     {
  219.       UnLock( lock1 );
  220.       UnLock( lock2 );
  221.  
  222.       if( DeleteFile( filename1 ) )
  223.       {
  224.         if( DeleteFile( filename2 ) )
  225.         {
  226.           n = atoi( MessageString );
  227.           if( (n == FirstMessage) && (n==LastMessage ))
  228.           {
  229.             MAILREAD_UpdateConfMailData( ConfNum, FirstMessage, LastMessage, MessageString, MailSys_Kill );
  230.           }
  231.           else
  232.           {
  233.             if( n == FirstMessage )
  234.             {
  235.               MAILREAD_UpdateConfMailData( ConfNum, FirstMessage, LastMessage, MessageString, MailSys_OFFSET_FirstMessage );
  236.             }
  237.             if( n == LastMessage )
  238.             {
  239.               MAILREAD_UpdateConfMailData( ConfNum, FirstMessage, LastMessage, MessageString, MailSys_OFFSET_LastMessage );
  240.             }
  241.           }
  242.           return( TRUE );
  243.         }
  244.       }
  245.     }
  246.   }
  247.   return( FALSE );
  248. }
  249.  
  250. BOOL MAILREAD_DisplayMessage( char *MessageString, int ConfNum )
  251. {
  252.   BOOL Done = FALSE;
  253.   int error=0, i=0;
  254.   BPTR file;
  255.   char filename[MAX_PATH_LENGTH], buffer[BUFFER_LENGTH], outstr[BUFFER_LENGTH];
  256.   struct Node *ConfPtr;
  257.  
  258.   ConfPtr = GetNode( BBSGlobal->ConfList, ConfNum-1 );
  259.  
  260.   sprintf( filename, "%sMail/Messages/%s.TXT\0", ((struct ConfData *)ConfPtr)->ConfPath, MessageString );
  261.  
  262.   DOOR_WriteText( "    /----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----"ANSI_FG_GREEN"*"ANSI_FG_WHITE"----/\r\n\r\n" );
  263.  
  264.   if( file = Open( filename, MODE_OLDFILE ))
  265.   {
  266.     i=0;
  267.     while( (error == 0)&&(!Done) )
  268.     {
  269.       if( FGets( file, buffer, 255 ))
  270.       {
  271.         i++;
  272.         sprintf( outstr, "%03d ", i );
  273.         stripcr( buffer );
  274.         strcat( buffer, "\r\n" );
  275.         DOOR_WriteText( outstr );
  276.         DOOR_WriteText( buffer );
  277.       }
  278.       else
  279.       {
  280.         Done = TRUE;
  281.         error = IoErr();
  282.       }
  283.     }
  284.     Close( file );
  285.  
  286.     if( error != 0 )
  287.     {
  288.       DOOR_WriteText( "Error in file..\r\n" );
  289.       return( FALSE );
  290.     }
  291.   }
  292.   return( TRUE );
  293. }
  294.  
  295. void READMAIL_DisplayHelp( void )
  296. {
  297.   DOOR_WriteText( "\r\n" );
  298.   DOOR_WriteText( "<CR>         - Go Forwards or Backwards\r\n" );
  299.   DOOR_WriteText( "A            - Display Message Again\r\n" );
  300.   DOOR_WriteText( "D            - Delete Message\r\n" );
  301.   DOOR_WriteText( "N, +         - Next Message\r\n" );
  302.   DOOR_WriteText( "P, -         - Prev Message\r\n" );
  303.   DOOR_WriteText( "T            - Download Attached Files\r\n" );
  304.   DOOR_WriteText( "Z            - Download Message (as text)\r\n" );
  305.   DOOR_WriteText( "Q            - Quit Reading\r\n" );
  306.   DOOR_WriteText( "\r\n\r\n" );
  307. }
  308.  
  309.  
  310. char *MAILREAD_GenerateOptionString( char *MessageNumber, int ConfNum )
  311. {
  312.   char *s;
  313.   struct MAIL_Message *MM;
  314.  
  315.   if( s = AllocVec( BUFFER_LENGTH, MEMF_CLEAR|MEMF_PUBLIC ))
  316.   {
  317.     MM = MAILSCAN_CreateMailMsgStruct( ConfNum, MessageNumber );
  318.  
  319.     sprintf( s, ANSI_FG_GREEN"Options :- "ANSI_FG_YELLOW"( %s%s%s%s%s%s%s%s%sQ ? )"ANSI_FG_WHITE" >", "+ ", "- ", "A ", "D ", GoingForwards ? ANSI_FG_WHITE"N "ANSI_FG_YELLOW : "N ", GoingForwards ? "P " : ANSI_FG_WHITE"P "ANSI_FG_YELLOW, "R ", (MM->MM_NAttachedFiles > 0) ? "T "  : "" , "Z " );
  320.   }
  321.  
  322.   return( s );
  323. }
  324.  
  325. int MAILREAD_ReadMessage( char *MessageName, int FirstMessage, int LastMessage, int ConfNum )
  326. {
  327.   int ReturnValue = 0;
  328.   BOOL DoOptionAgain;
  329.   char *optstr;
  330.  
  331.   if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
  332.   else DOOR_WriteText( "\r\n" );
  333.  
  334.   if( MAILREAD_DisplayHead( MessageName, ConfNum, LastMessage ) )
  335.   {
  336.     if( MAILREAD_DisplayMessage( MessageName, ConfNum ) )
  337.     {
  338.       DOOR_WriteText( "\r\n" );
  339.       DoOptionAgain = TRUE;
  340.       while( DoOptionAgain )
  341.       {
  342.         optstr = MAILREAD_GenerateOptionString( MessageName, ConfNum );
  343.         DOOR_WriteText( optstr );
  344.         FreeVec( optstr );
  345.         DOOR_GetLine( TRUE, TRUE, 0 );
  346.         if( N_ND->OnlineStatus==OS_ONLINE )
  347.         {
  348.           if( !(N_ND->CurrentLine[0]))
  349.           {
  350.             DoOptionAgain = FALSE;
  351.             ReturnValue = 7;
  352.           }
  353.           if( (!(stricmp( N_ND->CurrentLine, "+" )) || (!(stricmp( N_ND->CurrentLine, "N" )))))
  354.           {
  355.             DoOptionAgain = FALSE;
  356.             ReturnValue = 1;
  357.           }
  358.           if( (!(stricmp( N_ND->CurrentLine, "-" )) || (!(stricmp( N_ND->CurrentLine, "P" )))))
  359.           {
  360.             DoOptionAgain = FALSE;
  361.             ReturnValue = 2;
  362.           }
  363.           if( !(stricmp( N_ND->CurrentLine, "D" )))
  364.           {
  365.             if( MAILREAD_DeleteMessage( MessageName, FirstMessage, LastMessage, ConfNum ))
  366.             {
  367.               DOOR_WriteText( "Message Deleted\r\n" );
  368.               DoOptionAgain = FALSE;
  369.             }
  370.             else DOOR_WriteText( "Message NOT Deleted\r\n" );
  371.             DOOR_WriteText( ANSI_UP );
  372.             ReturnValue = 3;
  373.           }
  374.           if( !(stricmp( N_ND->CurrentLine, "A" )))
  375.           {
  376.             if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
  377.             else DOOR_WriteText( "\r\n" );
  378.             if( MAILREAD_DisplayHead( MessageName, ConfNum, LastMessage ) )
  379.             {
  380.               if( MAILREAD_DisplayMessage( MessageName, ConfNum ) )
  381.               {
  382.                 DOOR_WriteText( "\r\n" );
  383.               }
  384.               else
  385.               {
  386.                 DoOptionAgain = FALSE;
  387.                 ReturnValue = 7;
  388.               }
  389.             }
  390.             else
  391.             {
  392.               DoOptionAgain = FALSE;
  393.               ReturnValue = 7;
  394.             }
  395.           }
  396.           if( !(stricmp( N_ND->CurrentLine, "T" )))
  397.           {
  398.             DOOR_WriteText( "Transfer Message Selected\r\n" );
  399.             DOOR_WriteText( ANSI_UP );
  400.             ReturnValue = 4;
  401.           }
  402.           if( !(stricmp( N_ND->CurrentLine, "R" )))
  403.           {
  404.             DOOR_WriteText( "Reply To Message Selected\r\n" );
  405.             DOOR_WriteText( ANSI_UP );
  406.             ReturnValue = 5;
  407.           }
  408.           if( !(stricmp( N_ND->CurrentLine, "Q" )))
  409.           {
  410.             DoOptionAgain = FALSE;
  411.             if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen ))  DOOR_WriteText( ANSI_CLS );
  412.             else DOOR_WriteText( "\r\n" );
  413.             ReturnValue = 6;
  414.           }
  415.           if( !(stricmp( N_ND->CurrentLine, "?" )))
  416.           {
  417.             READMAIL_DisplayHelp();
  418.             ReturnValue = 7;
  419.           }
  420.         }
  421.         DOOR_WriteText( ANSI_UP );
  422.       }
  423.     }
  424.     else
  425.     {
  426.       DOOR_WriteText( "Error with message data (.TXT)\r\n" );
  427.     }
  428.   }
  429.   else
  430.   {
  431.     DOOR_WriteText( "Error with message info (.DAT)\r\n" );
  432.   }
  433.   return( ReturnValue );
  434. }
  435.  
  436. void MAILREAD_ReadMessages( struct List *MessageList, int ConfNum )
  437. {
  438.   struct Node *ptr;
  439.   BOOL GoToNext = TRUE, Forwards = TRUE;
  440.   int PosInList=0, LastMessage, FirstMessage;
  441.  
  442.   GoingForwards = TRUE;
  443.   FirstMessage = MAILSCAN_GetFirstMessage( ConfNum );
  444.   LastMessage = MAILSCAN_GetLastMessage( ConfNum );
  445.  
  446.   for( ptr = MessageList->lh_Head;  (((GoToNext)&&((ptr->ln_Succ)&&( N_ND->OnlineStatus==OS_ONLINE ))))||((!Forwards)&&(GoToNext)) ; ptr = ptr->ln_Succ )
  447.   {
  448.     if( Forwards )  PosInList++;
  449.  
  450.     if( ((!Forwards)&&( PosInList >1)) )
  451.     {
  452.       ptr = ptr->ln_Pred;
  453.       ptr = ptr->ln_Pred;
  454.       PosInList--;
  455.     }
  456.     else
  457.     {
  458.       if( !Forwards )
  459.       {
  460.         MYDOOR_DisplayTecLisMailHeader();
  461.         DOOR_WriteText( "\r\nSorry.  No more mail.\r\n\r\n" );
  462.         GoToNext = FALSE;
  463.       }
  464.     }
  465.     if( GoToNext )
  466.     {
  467.       switch( MAILREAD_ReadMessage( ptr->ln_Name, FirstMessage, LastMessage, ConfNum ) )
  468.       {
  469.         case 1:
  470.           GoingForwards = TRUE;
  471.           Forwards = TRUE;
  472.           break;
  473.         case 2:
  474.           GoingForwards = FALSE;
  475.           Forwards = FALSE;
  476.           break;
  477.         case 3:
  478.           FirstMessage = MAILSCAN_GetFirstMessage( ConfNum );
  479.           LastMessage = MAILSCAN_GetLastMessage( ConfNum );
  480.           break;
  481.         case 6:
  482.           GoToNext = FALSE;
  483.           break;
  484.  
  485.       }
  486.     }
  487.   }
  488.   if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
  489.   else DOOR_WriteText( "\r\n" );
  490. }
  491.  
  492. void MYDOOR_DoReadMail( int argc, char *argv[] )
  493. {
  494.   int confnum=0, CurrentMessage, LastMessage, FirstMessage;
  495.   char outstr[BUFFER_LENGTH], filename[MAX_PATH_LENGTH], CM_String[MAX_MAIL_NUM];
  496.   struct Node   *ConfPtr;
  497.   BOOL AtLeastOne = FALSE, GoToNext = TRUE, Forwards = TRUE;
  498.   BPTR lock;
  499.  
  500.   GoingForwards = TRUE;
  501.   confnum = N_ND->CurrentConf->ConfNum;
  502.   ConfPtr = GetNode( BBSGlobal->ConfList, confnum-1 );
  503.   FirstMessage = MAILSCAN_GetFirstMessage( confnum );
  504.   LastMessage = MAILSCAN_GetLastMessage( confnum );
  505.   CurrentMessage = FirstMessage;
  506.  
  507.   if( LastMessage != 0 )
  508.   {
  509.     while( ( CurrentMessage >= FirstMessage ) && (CurrentMessage <= LastMessage) && (GoToNext) )
  510.     {
  511.       if( (FirstMessage == 0) && (LastMessage == 0) ) GoToNext = FALSE;
  512.       else
  513.       {
  514.         sprintf( CM_String, "%d", CurrentMessage );
  515.         sprintf( filename, "%sMail/Messages/%s.DAT\0", ((struct ConfData *)ConfPtr)->ConfPath, CM_String );
  516.  
  517.         if( lock = Lock( filename, SHARED_LOCK ))
  518.         {
  519.           UnLock( lock );
  520.           if( MAILSCAN_IsMessageForCurrentUser( filename ) )
  521.           {
  522.             AtLeastOne = TRUE;
  523.  
  524.             switch( MAILREAD_ReadMessage( CM_String , FirstMessage, LastMessage, confnum ) )
  525.             {
  526.               case 1:
  527.                 GoingForwards = TRUE;
  528.                 Forwards = TRUE;
  529.                 break;
  530.               case 2:
  531.                 if( CurrentMessage-1 < 1 )
  532.                 {
  533.                   if( MAILREAD_CheckOption( MAILREAD_OPT_ClearScreen )) DOOR_WriteText( ANSI_CLS );
  534.                   else DOOR_WriteText( "\r\n" );
  535.                   MYDOOR_DisplayTecLisMailHeader();
  536.                   DOOR_WriteText( "\r\nSorry.  No more mail.\r\n\r\n" );
  537.                   GoToNext=FALSE;
  538.                 }
  539.                 else
  540.                 {
  541.                   GoingForwards = FALSE;
  542.                   Forwards = FALSE;
  543.                 }
  544.                 break;
  545.               case 3:
  546.                 FirstMessage = MAILSCAN_GetFirstMessage( confnum );
  547.                 LastMessage = MAILSCAN_GetLastMessage( confnum );
  548.                 break;
  549.               case 6:
  550.                 GoToNext = FALSE;
  551.                 DOOR_WriteText( "\r\n" );
  552.                 break;
  553.             }
  554.           }
  555.           else
  556.           {
  557.             if( (MessageBaseError != 0)&&(MessageBaseError != MAILERROR_FileDoesNotExist) )
  558.             {
  559.               GoToNext = FALSE;
  560.               DOOR_WriteText( "\r\n" );
  561.             }
  562.           }
  563.         }
  564.       }
  565.       if( Forwards ) CurrentMessage++;
  566.       else CurrentMessage--;
  567.     }
  568.   }
  569.   if( !AtLeastOne )
  570.   {
  571.     MYDOOR_DisplayTecLisMailHeader();
  572.     sprintf( outstr, "\r\nSorry %s.  No messages have been sent to you.\r\n\r\n", N_ND->User.CallData.Handle );
  573.     DOOR_WriteText( outstr );
  574.   }
  575.   else  DOOR_WriteText( "\r\n" );
  576.  
  577. }
  578.  
  579.